package pe.com.cineplanet.dao.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import pe.com.cineplanet.bean.cineplanet.Carrito;
import pe.com.cineplanet.bean.cineplanet.CarritoDetalle;
import pe.com.cineplanet.bean.cineplanet.Producto;
import pe.com.cineplanet.bean.cineplanet.UsuarioWeb;
import pe.com.cineplanet.dao.dao.CarritoDAO;


public class CarritoDAOImpl implements CarritoDAO{

	protected JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	public Carrito crearCarrito(UsuarioWeb usuario) {
		
		System.out.println("Crear Carrito para usuario: " + usuario.getLogin() );
		System.out.println("-------------------------------");
		
		StringBuffer sql =  new StringBuffer();
		sql.append("select max(id) from t_carrito");
		
		int maxId = 0;
		try{
			maxId = jdbcTemplate.queryForInt(sql.toString());
		}catch(EmptyResultDataAccessException e){
		}
		
		maxId++;
		
		sql =  new StringBuffer();
		sql.append("insert into t_carrito ");
		sql.append("(id, usuario_web, fecha, estado) ");
		sql.append("values (?, ?, sysdate(), '1')");
		
		Object[] params = new Object[]{ maxId, usuario.getLogin()  };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		if(result>0)
			System.out.println("Se grabo el carrito en modo temporal con el codigo : " + maxId);
		else
			System.out.println("No Se grabo el carrito!!!");
		System.out.println();
		
		return new Carrito(maxId);

	}

	public void agregarProducto(Producto producto, Carrito carrito, int cantidad) {
		System.out.println("prod " + producto);
		System.out.println("carr " + carrito);
		System.out.println("Agregar el producto " + producto.getId() + " al carrito : " + carrito.getId());
		System.out.println("------------------------------------------------------------");
	
		StringBuffer sql =  new StringBuffer();
		sql.append("select cantidad, precio from t_carrito_producto where id_carrito = ?  and id_producto=?");
		
		CarritoDetalle detalle = null;
		try{
			detalle = (CarritoDetalle) jdbcTemplate.queryForObject(sql.toString(), new Object[]{ carrito.getId(), producto.getId() }, new RowMapper(){

				@Override
				public CarritoDetalle mapRow(ResultSet rs, int arg1)
						throws SQLException {
					CarritoDetalle d = new CarritoDetalle();
					d.setCantidad(rs.getInt(1));
					d.setPrecio(rs.getDouble(2));
					return d;
				}
				
				
				
			});
		}catch(EmptyResultDataAccessException e){
		}
		
		System.out.println("Detalle: " + detalle);
		
		if( detalle == null){
		
			sql =  new StringBuffer();
			sql.append("insert into t_carrito_producto ");
			sql.append("(id_carrito, id_producto, cantidad, precio, total) ");
			sql.append("values (?, ?, ?, ? , ?)");
			
			Object[] params = new Object[]{ carrito.getId(), producto.getId(), cantidad, producto.getPrecio(), producto.getPrecio()*cantidad  };
			
			int result = jdbcTemplate.update(sql.toString(), params);
			
			if(result>0)
				System.out.println("Se grabo el producto en el carrito");
			else
				System.out.println("No Se grabo el producto en el carrito!!!");
			System.out.println();
			
		
		}else{
			
			
			sql =  new StringBuffer();
			sql.append("update t_carrito_producto ");
			sql.append(" set cantidad = ?, precio = ?, total = ? where id_carrito=? and id_producto=? ");
			
			Object[] params = new Object[]{ 
					detalle.getCantidad()+cantidad, 
					detalle.getPrecio(), 
					(detalle.getCantidad()+cantidad)*detalle.getPrecio(), 
					carrito.getId(), producto.getId()
			};
			
			int result = jdbcTemplate.update(sql.toString(), params);
			
			if(result>0)
				System.out.println("Se actualizo el producto en el carrito");
			else
				System.out.println("No Se grabo el producto en el carrito!!!");
			System.out.println();
			
			
		}
	}
	
	
	public void actualizarProducto(Producto producto, Carrito carrito, int cantidad) {
		System.out.println("prod " + producto);
		System.out.println("carr " + carrito);
		System.out.println("Agregar el producto " + producto.getId() + " al carrito : " + carrito.getId());
		System.out.println("------------------------------------------------------------");
	
		StringBuffer sql =  new StringBuffer();
		sql.append("select cantidad, precio from t_carrito_producto where id_carrito = ?  and id_producto=?");
		
		CarritoDetalle detalle = null;
		try{
			detalle = (CarritoDetalle) jdbcTemplate.queryForObject(sql.toString(), new Object[]{ carrito.getId(), producto.getId() }, new RowMapper(){

				@Override
				public CarritoDetalle mapRow(ResultSet rs, int arg1)
						throws SQLException {
					CarritoDetalle d = new CarritoDetalle();
					d.setCantidad(rs.getInt(1));
					d.setPrecio(rs.getDouble(2));
					return d;
				}
				
				
				
			});
		}catch(EmptyResultDataAccessException e){
		}
		
		System.out.println("Detalle: " + detalle);
		
		if( detalle != null){

			sql =  new StringBuffer();
			sql.append("update t_carrito_producto ");
			sql.append(" set cantidad = ?, precio = ?, total = ? where id_carrito=? and id_producto=? ");
			
			Object[] params = new Object[]{ 
					cantidad, 
					detalle.getPrecio(), 
					(cantidad)*detalle.getPrecio(), 
					carrito.getId(), producto.getId()
			};
			
			int result = jdbcTemplate.update(sql.toString(), params);
			
			if(result>0)
				System.out.println("Se actualizo el producto en el carrito");
			else
				System.out.println("No Se grabo el producto en el carrito!!!");
			System.out.println();
			
			
		}
	}

	public void quitarProducto(Producto producto, Carrito carrito) {
		System.out.println("Quitar el producto " + producto.getId() + " del carrito : " + carrito.getId());
		System.out.println("------------------------------------------------------------");
		
		StringBuffer sql =  new StringBuffer();
		sql.append("delete from t_carrito_producto ");
		sql.append("where id_carrito=? and id_producto=? ");
		
		Object[] params = new Object[]{ carrito.getId(), producto.getId()  };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		if(result>0)
			System.out.println("Se elimino el producto en el carrito");
		else
			System.out.println("No Se elimino el producto en el carrito!!!");
		System.out.println();
		
	}
	
	public void quitarProductos(Carrito carrito) {

		StringBuffer sql =  new StringBuffer();
		sql.append("delete from t_carrito_producto ");
		sql.append("where id_carrito=? ");
		
		Object[] params = new Object[]{ carrito.getId() };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		if(result>0)
			System.out.println("Se elimino el producto en el carrito");
		else
			System.out.println("No Se elimino el producto en el carrito!!!");
		System.out.println();
		
	}

	public void grabarCarrito(Carrito carrito) {
		System.out.println("Grabar el carrito : " + carrito.getId());
		System.out.println("------------------------------------------------------------");
		
		StringBuffer sql =  new StringBuffer();
		sql.append("update t_carrito ");
		sql.append("set estado = '2' ");
		sql.append("where id=? ");
		
		Object[] params = new Object[]{ carrito.getId() };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		if(result>0)
			System.out.println("Se finalizo el carrito.");
		else
			System.out.println("No Se finalizo el carrito!!!");
		System.out.println();
	}

	public Carrito findCarritoById(int id) {
		StringBuffer sql =  new StringBuffer();
		sql.append("select id, u.login, u.nombre, u.correo, fecha, c.estado ");
		sql.append("from T_carrito c ");
		sql.append("inner join t_usuario_web u on u.login = c.usuario_web ");
		sql.append("where id=?");
		
		Object[] params = new Object[]{ id };
		
		try{
			return (Carrito) jdbcTemplate.queryForObject(sql.toString(), params, new RowMapper(){

				public Carrito mapRow(ResultSet rs, int arg1) throws SQLException {
					
					UsuarioWeb usuario = new UsuarioWeb(rs.getString(2), rs.getString(3), rs.getString(4));
					Carrito carrito = new Carrito();
					carrito.setId(rs.getInt(1));
					carrito.setUsuarioWeb(usuario);
					carrito.setFecha(rs.getDate(5));
					carrito.setEstado(rs.getString(6));
					return carrito;
					
				}
				
			});
		}catch(EmptyResultDataAccessException e){
			return null;
		}
	}

	public Producto findProductoById(int id) {
		StringBuffer sql =  new StringBuffer();
		sql.append("select id, nombre, descripcion, precio ");
		sql.append("from T_producto ");
		sql.append("where id=?");
		
		Object[] params = new Object[]{ id };
		
		try{
			return (Producto) jdbcTemplate.queryForObject(sql.toString(), params, new RowMapper(){

				public Producto mapRow(ResultSet rs, int arg1) throws SQLException {
					
					Producto producto = new Producto();
					producto.setId(rs.getInt(1));
					producto.setNombre(rs.getString(2));
					producto.setDescripcion(rs.getString(3));
					producto.setPrecio(rs.getDouble(4));
					return producto;
					
				}
				
			});
		}catch(EmptyResultDataAccessException e){
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Producto> findProductoByDesc(String desc) {
		StringBuffer sql =  new StringBuffer();
		sql.append("select id, nombre, descripcion, precio ");
		sql.append("from T_producto ");
		sql.append("where nombre like ?");
		
		Object[] params = new Object[]{ "%" + desc + "%"};
		
		try{
			return jdbcTemplate.query(sql.toString(), params, new RowMapper(){

				public Producto mapRow(ResultSet rs, int arg1) throws SQLException {
					
					Producto producto = new Producto();
					producto.setId(rs.getInt(1));
					producto.setNombre(rs.getString(2));
					producto.setDescripcion(rs.getString(3));
					producto.setPrecio(rs.getDouble(4));
					return producto;
					
				}
				
			});
		}catch(EmptyResultDataAccessException e){
			return null;
		}
	}

	@Override
	public Carrito existCarrito(UsuarioWeb usuario) {
		StringBuffer sql =  new StringBuffer();
		sql.append("select id, u.login, u.nombre, u.correo, fecha, c.estado ");
		sql.append("from T_carrito c ");
		sql.append("inner join t_usuario_web u on u.login = c.usuario_web ");
		sql.append("where u.login=? and c.estado='1' "); // Buscar el carrito activo
		
		Object[] params = new Object[]{ usuario.getLogin() };
		
		try{
			return (Carrito) jdbcTemplate.queryForObject(sql.toString(), params, new RowMapper(){

				public Carrito mapRow(ResultSet rs, int arg1) throws SQLException {
					
					UsuarioWeb usuario = new UsuarioWeb(rs.getString(2), rs.getString(3), rs.getString(4));
					Carrito carrito = new Carrito();
					carrito.setId(rs.getInt(1));
					carrito.setUsuarioWeb(usuario);
					carrito.setFecha(rs.getDate(5));
					carrito.setEstado(rs.getString(6));
					return carrito;
					
				}
				
			});
		}catch(EmptyResultDataAccessException e){
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<CarritoDetalle> detailFrom(Carrito carrito) {
		StringBuffer sql =  new StringBuffer();
		sql.append("select p.id, p.nombre, cp.cantidad, cp.precio, cp.total ");
		sql.append("from T_carrito c ");
		sql.append("inner join t_carrito_producto cp on c.id = cp.id_carrito ");
		sql.append("inner join t_producto p on cp.id_producto = p.id ");
		sql.append("where c.id = ? "); // Buscar el carrito activo
		
		Object[] params = new Object[]{ carrito.getId() };
		
		try{
			return jdbcTemplate.query(sql.toString(), params, new RowMapper(){

				public CarritoDetalle mapRow(ResultSet rs, int arg1) throws SQLException {
					
					CarritoDetalle detalle = new CarritoDetalle();
					Producto producto = new Producto();
					producto.setId(rs.getInt(1));
					producto.setNombre(rs.getString(2));
					detalle.setProducto(producto);
					detalle.setCantidad(rs.getInt(3));
					detalle.setPrecio(rs.getDouble(4));
					detalle.setTotal(rs.getDouble(5));
					
					return detalle;
					
				}
				
			});
		}catch(EmptyResultDataAccessException e){
			return null;
		}
	}

}
